package top.blackr.folivora.common.security.auth.impl;

import top.blackr.folivora.common.security.auth.LoginAuthentication;
import top.blackr.folivora.common.security.auth.SecUser;

public interface LoginService {

    /**
     * 三方登录验证，空逻辑，具体逻辑交给不同的登录类型处理
     *
     * @param authentication 登陆凭证
     * @return 系统用户
     * @see CodeLoginServiceImpl
     */
    SecUser authentication(LoginAuthentication authentication);

    default SecUser login(LoginService loginService, LoginAuthentication authentication) {
        // 登陆前置操作，日志打印等扩展操作
        loginService.loginBefore(authentication);
        // 开始登陆，返回用户信息
        SecUser user = loginService.authentication(authentication);
        // 登陆后置操作，生成token，查询权限，缓存用户信息
        return loginService.loginAfter(authentication, user);
    }

    /**
     * 登陆前置
     *
     * @param authentication 登陆凭证
     */
    void loginBefore(LoginAuthentication authentication);

    /**
     * 登陆后置
     *
     * @param authentication 登陆凭证
     * @param user           登陆用户信息
     * @return token
     */
    SecUser loginAfter(LoginAuthentication authentication, SecUser user);
}
